package events;

/**
* @brief Clase encargada de manejar eventos (envio y recepcion)
* @author Carlos Rodriguez Dominguez
* @date 13/11/2008
*
* Clase que permite registrar objetos, asi como enviar y recibir 
* eventos distribuidos. Para que se reciba un evento, debera haber
* registrado un objeto con un listener apropiado.
*/
public class EventHandler {
	
	private EventHandlerSupplier channel_out; /**< Canal de salida para los eventos (event supplier) */
	
	@SuppressWarnings("unused")
	private EventHandlerConsumer channel_input; /**< Canal de entrada para los eventos (event consumer) */
	
	private java.util.ArrayList<ListeningObject> objects; /**< Vector de objetos registrados */
	
	/**
	* @brief Clase encargada de manejar los eventos recibidos
	* @author Carlos Rodriguez Dominguez
	* 
	* Subclase de EventConsumer que implementa los metodos virtuales
	* "disconnect_push_consumer" y "push". Funcionara como event consumer
	* propio para el manejador de eventos.
	*/
	private class EventHandlerConsumer extends EventConsumer{
		/**
		* Constructor
		*
		* @param __orb Orbe de CORBA ya inicializado
		* @param e Referencia al manejador de eventos
		*/
		public EventHandlerConsumer(org.omg.CORBA.ORB __orb)
		{
			super(__orb);
		}

		/**
		* Determina lo que ocurre al desconectarse el event consumer.
		* Se ejecutara al llamarse al destructor de la clase.
		*/
		public void disconnect_push_consumer()
		{
			
		}
		
		/**
		* Se ejecutara al recibirse un evento. Se encarga de comprobar
		* si algun componente del manejador de eventos acepta el evento.
		* Si esto ocurre, entonces se ejecuta la accion asociada al listener
		* del evento recibido.
		*
		* @param data Evento recibido
		*/
		public void push(org.omg.CORBA.Any data)
		{
			int len = objects.size();
			for (int i=0; i<len; i++)
			{
				objects.get(i).listen(data);
			}
		}
	}

	/**
	* @brief Clase encargada de enviar eventos distribuidos (seran
	*        recibidos por los event consumers en ejecucion)
	* @author Carlos Rodriguez Dominguez
	*
	* Subclase de EventSupplier que implementa el metodo virtual
	* "disconnect_push_supplier". Funcionara como event supplier
	* propio para el manejador de eventos.
	*/
	private class EventHandlerSupplier extends EventSupplier {
		/**
		* Constructor
		*
		* @param __orb Orbe de CORBA ya inicializado
		* @param e Referencia al manejador de eventos
		*/
		public EventHandlerSupplier(org.omg.CORBA.ORB __orb)
		{
			super(__orb);
		}

		/**
		* Determina lo que ocurre al desconectarse el event supplier.
		* Se ejecutara al llamarse al destructor de la clase.
		*/
		public void disconnect_push_supplier()
		{
			
		}
	}
	
	/**
	* Constructor
	*
	* @param __orb Orbe de CORBA ya inicializado
	*/
	public EventHandler(org.omg.CORBA.ORB __orb)
	{
		channel_out = new EventHandlerSupplier(__orb);
		channel_input = new EventHandlerConsumer(__orb);
		
		objects = new java.util.ArrayList<ListeningObject>();
	}
	
	/**
	* Envia un evento
	* @param ev Evento a enviar
	*/
	public void push(Event ev)
	{
		channel_out.push(ev.to_any());
	}
	
	/**
	* Registra un nuevo objeto que "escucha" eventos
	* distribuidos
	*
	* @param obj Objeto a registrar
	*/
	public void register_object(ListeningObject obj)
	{
		objects.add(obj);
	}
	
	/**
	* Des-Registra un objeto que "escucha" eventos
	* distribuidos
	*
	* @param obj Objeto a des-registrar
	*/
	public void unregister_object(ListeningObject obj)
	{
		objects.remove(obj);
	}
}
